/*
 * Copyright (c) 2000
 *	Traakan, Inc., Los Altos, CA
 *	All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice unmodified, this list of conditions, and the following
 *    disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/*
 * Project:  NDMJOB
 * Ident:    $Id: $
 *
 * Description:
 *	NDMPv0, represented here, is a ficticious version
 *	used to negotiate NDMP protocol version for the
 *	remainder of the session. Early, as a connection is
 *	being set up, the version of the protocol is unknown.
 *	The first messages exchanged negotiate the protocol
 *	version, and such messages are in the NDMP format.
 *	This is different than other protocols, such as ONC RPC
 *	which negotiate version by lower layers before the
 *	objective protocol becomes involved. During the
 *	negotiation, we deem the connection to be in "v0" mode.
 *	This NDMPv0 protocol specification is the subset of
 *	the NDMP protocol(s) required for the negotiation,
 *	and necessarily must remain immutable for all time.
 */


/*
 * Copyright (c) 1997 Network Appliance. All Rights Reserved.
 *
 * Network Appliance makes no representations concerning either
 * the merchantability of this software or the suitability of this
 * software for any particular purpose. It is provided "as is"
 * without express or implied warranty of any kind.
 *
 * These notices must be retained in any copies of any part of this
 * documentation and/or software.
 *
 */

const NDMPPORT = 10000;

enum ndmp0_error
{
	NDMP0_NO_ERR,			/* No error */
	NDMP0_NOT_SUPPORTED_ERR,	/* Call is not supported */
	NDMP0_DEVICE_BUSY_ERR,		/* The device is in use */
	NDMP0_DEVICE_OPENED_ERR,	/* Another tape or scsi device
					 * is already open */
	NDMP0_NOT_AUTHORIZED_ERR,	/* connection has not been authorized*/
	NDMP0_PERMISSION_ERR,		/* some sort of permission problem */
	NDMP0_DEV_NOT_OPEN_ERR,		/* SCSI device is not open */
	NDMP0_IO_ERR,			/* I/O error */
	NDMP0_TIMEOUT_ERR,		/* command timed out */
	NDMP0_ILLEGAL_ARGS_ERR,		/* illegal arguments in request */
	NDMP0_NO_TAPE_LOADED_ERR,	/* Cannot open because there is
					   no tape loaded */
	NDMP0_WRITE_PROTECT_ERR,	/* tape cannot be open for write */
	NDMP0_EOF_ERR,			/* Command encountered EOF */
	NDMP0_EOM_ERR,			/* Command encountered EOM */
	NDMP0_FILE_NOT_FOUND_ERR,	/* File not found during restore */
	NDMP0_BAD_FILE_ERR,		/* The file descriptor is invalid */
	NDMP0_NO_DEVICE_ERR,		/* The device is not at that target */
	NDMP0_NO_BUS_ERR,		/* Invalid controller */
	NDMP0_XDR_DECODE_ERR,		/* Can't decode the request argument */
	NDMP0_ILLEGAL_STATE_ERR,	/* Call can't be done at this state */
	NDMP0_UNDEFINED_ERR,		/* Undefined Error */
	NDMP0_XDR_ENCODE_ERR,		/* Can't encode the reply argument */
	NDMP0_NO_MEM_ERR		/* no memory */
};

enum ndmp0_header_message_type
{
	NDMP0_MESSAGE_REQUEST,
	NDMP0_MESSAGE_REPLY
};

enum ndmp0_message
{
	NDMP0_CONNECT_OPEN = 0x900,	/* CONNECT INTERFACE */
	NDMP0_CONNECT_CLOSE = 0x902,

	NDMP0_NOTIFY_CONNECTED = 0x502
};

struct ndmp0_header
{
	u_long			sequence;	/* monotonically increasing */
	u_long			time_stamp;	/* time stamp of message */
	ndmp0_header_message_type message_type;	/* what type of message */
	ndmp0_message		message;	/* message number */
	u_long			reply_sequence;	/* reply is in response to */
	ndmp0_error		error;		/* communications errors */
};

/**********************/
/*  CONNECT INTERFACE */
/**********************/
/* NDMP0_CONNECT_OPEN */
struct ndmp0_connect_open_request
{
	u_short	protocol_version;	/* the version of protocol supported */
};

struct ndmp0_connect_open_reply
{
	ndmp0_error	error;
};

/* NDMP0_CONNECT_CLOSE */
/* no request arguments */
/* no reply arguments */

/****************************/
/* NOTIFY INTERFACE	    */
/****************************/

/* NDMP0_NOTIFY_CONNECTED */
enum ndmp0_connect_reason
{
	NDMP0_CONNECTED,	/* Connect sucessfully */
	NDMP0_SHUTDOWN,		/* Connection shutdown */
	NDMP0_REFUSED		/* reach the maximum number of connections */
};

struct ndmp0_notify_connected_request
{
	ndmp0_connect_reason	reason;
	u_short			protocol_version;
	string			text_reason<>;
};
